R

[R语言] 投资组合的马可威茨模型

这是一篇关于投资组合的管中窥豹

Posted by Leung ZhengHua on 2018-01-14

本文总点击量

基本思想

在投资里面,资产组合一定要考虑,本文从马可威茨模型开始说起。

假设我们有$p$个股票,收益率视为随机变量$r_1,r_2,…,r_p$,那么资产组合可以记为$R=w_1 r_1+w_2 r_2+…+w_p r_p=w’r$,资产组合的均值可以记为$E(R)$,方差可以记为$var(R)$,由多元统计知识知道

其中$\Sigma$是p维随机变量$r$的协方差矩阵。由于$\Sigma$是一个实对称阵,其二次型必然是大于等于0的,也就是$var(R) \geq 0$,在主对角线元素不变的条件下,非对角线元素越多0,那么协方差阵的行列式(广义方差)越小,因此我们希望给定的随机变量尽可能地不相关。所以马可威茨模型的思想就是通过线性规划求得资产组合的权重向量$w$,使之满足

从运筹学的角度看,通常所求的解$w$必然刚好用足条件$ w’E(r) \geq \alpha$,也即$\ w’E(r) = \alpha$。

在实际情况中,通常使用$E(r)=\bar{r}$,即样本均值代替期望收益率;$\Sigma=\hat{\Sigma}$,即样本协方差阵代替总体协方差阵。所以优化问题又可以重新表述如下:

由于$\bar{r}$和$\hat{\Sigma}$都已知了,接下来就是线性规划的求解了,通常我们假定$w \geq 0$;如若不然,那就是允许卖空,这个在中国A股市场是做不到的。

从线性规划的角度看,给定约束条件,求解目标函数值最小化问题的意思可以从上图体会,约束条件等价于在$y$轴取一个固定值(给定收益),目标函数最小等价于在$x$轴取最小值。有效前沿包裹的区域的每一个点都对应着一组权重向量$w$构成的投资组合(Minimum Risk Efficient Portfolio)的收益和标准差。标准差最小的投资组合(由有效前沿最左端的红点表示),称之为Global Minimum Variance Portfolio。这种投资组合虽然方差最小,但收益也不是很高,不是最优的,因为要使投资组合的方差最小意味着放弃了约束条件解优化问题,不再要求投资组合收益要大于某个阈值。

R语言实现

统计之都上有一个中央财经大学的学生介绍投资组合在R的应用,质量还可以。详见使用 R 语言构造投资组合的有效前沿

这里引入一个关于资产管理的R包fPortfolio,里面的函数挺丰富的,先mark一下,这个以后应该可以用得上。参考链接R语言玩转资产组合计算

更深度的用法可见组合约束

Minimum Risk Efficient Portfolio

给定一个目标收益率,投资组合方差最小化问题的求解可以通过以下方式解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
library(fPortfolio)
lppData <- 100 * LPP2005.RET[, 1:6] #取前6个股票的收益率序列作为example的对象
minriskSpec <- portfolioSpec() # 初始化约束
#targetReturn <- getTargetReturn(ewPortfolio@portfolio)["mean"]
targetReturn <-0.0431 # 设定投资组合的目标收益率
setTargetReturn(minriskSpec) <- targetReturn
minriskPortfolio <- efficientPortfolio(
data = lppData,
spec = minriskSpec,
constraints = "LongOnly") # 约束条件为长期(Long)持有,不允许卖空
print(minriskPortfolio)

这个求解相当于得到有效前沿中的一个点,后面会介绍一个一次求前沿曲线各个点的函数。

输出结果是这样的,Covariance Risk Budgets表示在解得的权重向量$w$下各个股票对投资组合贡献的方差。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Title:
MV Efficient Portfolio
Estimator: covEstimator
Solver: solveRquadprog
Optimize: minRisk
Constraints: LongOnly
Portfolio Weights:
SBI SPI SII LMI MPI ALT
0.0000 0.0086 0.2543 0.3358 0.0000 0.4013
Covariance Risk Budgets:
SBI SPI SII LMI MPI ALT
0.0000 0.0184 0.1205 -0.0100 0.0000 0.8711
Target Returns and Risks:
mean Cov CVaR VaR
0.0431 0.2451 0.5303 0.3412
Description:
Sat Jan 20 21:42:01 2018 by user: Administrator

Global Minimum Variance Portfolio

如果放弃对目标收益率约束条件,直接求方差最小的投资组合,方法如下:

1
2
3
4
5
6
globminSpec <- portfolioSpec()
globminPortfolio <- minvariancePortfolio(
data = lppData,
spec = globminSpec,
constraints = "LongOnly")
print(globminPortfolio)

输出结果的解读同上,这个全局方差最小的投资组合不过是有效前沿最左端的点,没有什么特别的地方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Title:
MV Minimum Variance Portfolio
Estimator: covEstimator
Solver: solveRquadprog
Optimize: minRisk
Constraints: LongOnly
Portfolio Weights:
SBI SPI SII LMI MPI ALT
0.3555 0.0000 0.0890 0.4893 0.0026 0.0636
Covariance Risk Budgets:
SBI SPI SII LMI MPI ALT
0.3555 0.0000 0.0890 0.4893 0.0026 0.0636
Target Returns and Risks:
mean Cov CVaR VaR
0.0105 0.0986 0.2020 0.1558
Description:
Sat Jan 20 21:48:00 2018 by user: Administrator

Tangency Portfolio

这个投资组合的概念的提出,是由于需要在有效前沿中各种投资组合取一种作为最优投资组合。评价标准可以取夏普比率$sharpe=\frac{E(R_p)-r_f}{\sigma_p}$,即单位风险承担的超额收益应该最大。这个概念可以结合资本市场线(CML)可以从下图理解:

两个小红点之间的线段上每一个点也有其意义,每一个点都表示投资者在无风险资产($y$轴上的小红点)和某有效的投资组合(有效前沿的小红点)之间按一定比例配置资金对应的收益和标准差,这个小红点表示的投资组合就是Tangency Portfolio。可以看出,在有效前沿其他点与无风险资产($y$轴上的小红点)的斜率都小于Tangency Portfolio对应的斜率,也就是夏普比率不如Tangency Portfolio高。

1
2
3
4
5
6
7
8
tgSpec <- portfolioSpec()
setRiskFreeRate(tgSpec) <- 0 # 无风险利率设为0,即过原点与有效前沿曲线的切线
tgPortfolio <- tangencyPortfolio(
data = lppData,
spec = tgSpec,
constraints = "LongOnly") # 除了函数名字不一样,其他都同上
print(tgPortfolio)

有效前沿曲线的计算

这里介绍有效前沿曲线的计算,而非某一个有效的投资组合,实际上就是对约束条件的目标收益率取一系列值,由此把优化问题的解汇总到一起。

1
2
3
4
5
6
7
lppSpec <- portfolioSpec()
setNFrontierPoints(lppSpec) <- 5 # 设定求解次数(有效前沿曲线的点数)
longFrontier <- portfolioFrontier(lppData, lppSpec)
print(longFrontier)
longFrontier <- portfolioFrontier(lppData) # 缺省,取标准点数
plot(longFrontier)

均值-方差模型更多的细节可以参考Rmetrics的官方文档《Portfolio Optimization with R/Rmetrics》